/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package siam;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 *
 * @author julien
 */
public class JoueurHumain extends Joueur {

    //private boolean rotation;
    private ActionListener selectReserve;
    private ActionListener selectJoueur;
    private ActionListener rotation;
    private ActionListener validerCoup;
    private ActionListener retirerPiece;
    private ActionListener deplacement;
    private ActionListener insertHGE;
    private ActionListener insertHGS;
    private ActionListener insertHDO;
    private ActionListener insertHDS;
    private ActionListener insertBGE;
    private ActionListener insertBGN;
    private ActionListener insertBDO;
    private ActionListener insertBDN;
    private ActionListener insert01;
    private ActionListener insert02;
    private ActionListener insert03;
    private ActionListener insert10;
    private ActionListener insert20;
    private ActionListener insert30;
    private ActionListener insert14;
    private ActionListener insert24;
    private ActionListener insert34;
    private ActionListener insert41;
    private ActionListener insert42;
    private ActionListener insert43;
    private Color rouge = new Color(255, 0, 0);
    private Color gris = new Color(242, 242, 242);
    private static int positionJoueur = 1;
    private JButton jBsource;
    private JButton jBcible;

    public JoueurHumain(int numJ, Plateau p, JLabel info) {
        super(numJ, p, info);

        selectReserve = new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                clearJButton();

                infoUtilisateur.setText("Inserez votre pièce où vous le souhaitez.");

                plateau.getReserveJoueur1().setBorder(BorderFactory.createLineBorder(gris));
                plateau.getReserveJoueur1().removeActionListener(selectReserve);
                plateau.getReserveJoueur2().setBorder(BorderFactory.createLineBorder(gris));
                plateau.getReserveJoueur2().removeActionListener(selectReserve);

                if (numJoueur == 1) {
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[0][0] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,0):E")) {//format I(numLigne,numColonne):NSEOnseo
                            //permettre insertion avec la flèche HGE
                            plateau.getHGE().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,0):S")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getHGS().setVisible(true);
                        }
                    }
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[0][4] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,4):S")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getHDS().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,4):O")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getHDO().setVisible(true);
                        }
                    }
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[4][0] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,0):N")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBGN().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,0):E")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBGE().setVisible(true);
                        }
                    }
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[4][4] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,4):N")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBDN().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,4):O")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBDO().setVisible(true);
                        }
                    }
                } else if (numJoueur == 2) {
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[0][0] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,0):e")) {//format I(numLigne,numColonne):NSEOnseo
                            //permettre insertion avec la flèche HGE
                            plateau.getHGE().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,0):s")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getHGS().setVisible(true);
                        }
                    }
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[0][4] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,4):s")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getHDS().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(0,4):o")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getHDO().setVisible(true);
                        }
                    }
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[4][0] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,0):n")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBGN().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,0):e")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBGE().setVisible(true);
                        }
                    }
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[4][4] != 'X') {
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,4):n")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBDN().setVisible(true);
                        }
                        if (plateau.getPlateauCaracteres().coupInsertionValide("I(4,4):o")) {
                            //permettre insertion avec la flèche HGS
                            plateau.getBDO().setVisible(true);
                        }
                    }
                }

                for (int i = 0; i < 5; i++) {
                    for (int j = 0; j < 5; j++) {
                        if (i == 0 || j == 0 || i == 4 || j == 4) {
                            if (plateau.getPlateauCaracteres().getPiece(i, j) == 'X') {
                                //permettre l'insertion sur la case
                                plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                //puis actionistenner pour la rotation
                                if (plateau.getTabBouttons()[i][j].getActionListeners().length == 0) {
                                    plateau.getTabBouttons()[i][j].addActionListener(rotation);
                                } else {
                                    JOptionPane.showMessageDialog(null, "le boutton " + plateau.getTabBouttons()[i][j].getName() + " a " + plateau.getTabBouttons()[i][j].getActionListeners().length + " listener !");
                                }

                            } else {
                                if (i == 0 && j == 1) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):S")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert01);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):s")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert01);
                                    }
                                }
                                if (i == 0 && j == 2) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):S")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert02);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):s")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert02);
                                    }
                                }
                                if (i == 0 && j == 3) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):S")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert03);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):s")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert03);
                                    }
                                }
                                if (i == 1 && j == 0) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):E")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert10);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):e")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert10);
                                    }
                                }
                                if (i == 2 && j == 0) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):E")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert20);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):e")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert20);
                                    }
                                }
                                if (i == 3 && j == 0) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):E")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert30);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):e")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert30);
                                    }
                                }
                                if (i == 1 && j == 4) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):O")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert14);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):o")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert14);
                                    }
                                }
                                if (i == 2 && j == 4) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):O")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert24);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):o")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert24);
                                    }
                                }
                                if (i == 3 && j == 4) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):O")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert34);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):o")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert34);
                                    }
                                }
                                if (i == 4 && j == 1) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):N")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert41);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):n")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert41);
                                    }
                                }
                                if (i == 4 && j == 2) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):N")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert42);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):n")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert42);
                                    }
                                }
                                if (i == 4 && j == 3) {
                                    if (numJoueur == 1 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):N")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert43);
                                    }
                                    if (numJoueur == 2 && plateau.getPlateauCaracteres().coupInsertionValide("I(" + i + "," + j + "):n")) {
                                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                                        plateau.getTabBouttons()[i][j].addActionListener(insert43);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        };

        selectJoueur = new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                clearJButton();

                infoUtilisateur.setText("Cliquez sur la case où vous voulez positionner votre pièce");

                if (e.getSource() instanceof JButton) {
                    jBsource = (JButton) e.getSource();
                    int i = Integer.valueOf(String.valueOf(jBsource.getName().charAt(2)));
                    int j = Integer.valueOf(String.valueOf(jBsource.getName().charAt(3)));


                    //enlever l'encadré rouge sur toute les cases.
//                plateau.initEncadreGris();
                    jBsource.setBorder(BorderFactory.createLineBorder(rouge));
                    jBsource.addActionListener(rotation);

                    //mette les encadré rouge et les action listenner sur les cases ou les coup sont possibles
                    if (numJoueur == 1) {
                        if ((i + 1) <= 4) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + (i + 1) + "," + j + "):S")) {
                                plateau.getTabBouttons()[(i + 1)][j].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[(i + 1)][j].addActionListener(deplacement);
                            }
                        }
                        if ((i - 1) >= 0) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + (i - 1) + "," + j + "):N")) {
                                plateau.getTabBouttons()[(i - 1)][j].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[(i - 1)][j].addActionListener(deplacement);
                            }
                        }
                        if ((j + 1) <= 4) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + i + "," + (j + 1) + "):E")) {
                                plateau.getTabBouttons()[i][(j + 1)].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[i][(j + 1)].addActionListener(deplacement);
                            }
                        }
                        if ((j - 1) >= 0) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + i + "," + (j - 1) + "):O")) {
                                plateau.getTabBouttons()[i][(j - 1)].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[i][(j - 1)].addActionListener(deplacement);
                            }
                        }
                    } else if (numJoueur == 2) {
                        if ((i + 1) <= 4) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + (i + 1) + "," + j + "):s")) {
                                plateau.getTabBouttons()[(i + 1)][j].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[(i + 1)][j].addActionListener(deplacement);
                            }
                        }
                        if ((i - 1) >= 0) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + (i - 1) + "," + j + "):n")) {
                                plateau.getTabBouttons()[(i - 1)][j].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[(i - 1)][j].addActionListener(deplacement);
                            }
                        }
                        if ((j + 1) <= 4) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + i + "," + (j + 1) + "):e")) {
                                plateau.getTabBouttons()[i][(j + 1)].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[i][(j + 1)].addActionListener(deplacement);
                            }
                        }
                        if ((j - 1) >= 0) {
                            if (plateau.getPlateauCaracteres().coupDeplacementValide("D(" + i + "," + j + ")(" + i + "," + (j - 1) + "):o")) {
                                plateau.getTabBouttons()[i][(j - 1)].setBorder(BorderFactory.createLineBorder(rouge));
                                plateau.getTabBouttons()[i][(j - 1)].addActionListener(deplacement);
                            }
                        }
                    }






                    //afficher le boutton "retirer piece" si elle est sur un bord et attribuer le action listenner au boutton "retirer piece"
                    if (i == 0 || i == 4 || j == 0 || j == 4) {
                        plateau.getjBRetirerPlateau().setVisible(true);

                    }

                }
            }
        };

        rotation = new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                clearJButton();

                infoUtilisateur.setText("Cliquez sur votre pièce pour la faire tourner de 90° !");

                if (e.getSource() instanceof JButton) {

                    jBcible = (JButton) e.getSource();
                    int x = Integer.valueOf(String.valueOf(jBcible.getName().charAt(2)));
                    int y = Integer.valueOf(String.valueOf(jBcible.getName().charAt(3)));

                    //enlever l'encadré rouge sur tte les case sauf this
                    plateau.initEncadreGris();
                    jBcible.setBorder(BorderFactory.createLineBorder(rouge));

                    //on remet l'action listener sur le button courrant
                    if (jBcible.getActionListeners().length == 0) {
                        jBcible.addActionListener(rotation);
                    }

                    //afficher une piece du joueur + 90 degres
                    if (positionJoueur == 4) {
                        positionJoueur = 1;
                    } else {
                        positionJoueur++;
                    }
                    if (numJoueur == 1) {
                        switch (positionJoueur) {
                            case 1:

                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'N';
                                break;
                            case 2:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'E';//D(x,y)(x,y):E
                                break;
                            case 3:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'S';
                                break;
                            case 4:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'O';
                                break;
                        }
                    } else if (numJoueur == 2) {
                        switch (positionJoueur) {
                            case 1:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'n';
                                break;
                            case 2:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'e';
                                break;
                            case 3:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 's';
                                break;
                            case 4:
                                plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'o';
                                break;
                        }
                    }

                    plateau.generePlateau();

                    //afficher le bouton "valider coup"
                    plateau.getjBValiderCoup().setVisible(true);
                } else {
                    JOptionPane.showMessageDialog(null, "Le cliqué n'est pas un JButton !");
                }
            }
        };

        deplacement = new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                clearJButton();

                if (jBsource != null && e.getSource() instanceof JButton) {

                    jBcible = (JButton) e.getSource();

                    int iSource = Integer.valueOf(String.valueOf(jBsource.getName().charAt(2)));
                    int jSource = Integer.valueOf(String.valueOf(jBsource.getName().charAt(3)));
                    int iCible = Integer.valueOf(String.valueOf(jBcible.getName().charAt(2)));
                    int jCible = Integer.valueOf(String.valueOf(jBcible.getName().charAt(3)));

                    boolean mettreRotation = false;
                    if (plateau.getPlateauCaracteres().getTabCaracteres()[iCible][jCible] == 'X') {
                        mettreRotation = true;
                    }

                    try {
                        if (numJoueur == 1) {
                            if (iCible == (iSource + 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):S");
                            }
                            if (iCible == (iSource - 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):N");
                            }
                            if (jCible == (jSource + 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):E");
                            }
                            if (jCible == (jSource - 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):O");
                            }

                        } else if (numJoueur == 2) {
                            if (iCible == (iSource + 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):s");
                            }
                            if (iCible == (iSource - 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):n");
                            }
                            if (jCible == (jSource + 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):e");
                            }
                            if (jCible == (jSource - 1)) {
                                plateau.getPlateauCaracteres().deplacerPiece("D(" + iSource + "," + jSource + ")(" + iCible + "," + jCible + "):o");
                            }
                        }
                    } catch (Exception re) {
                        JOptionPane.showMessageDialog(null, "Erreur dans le deplacement\n" + re.getLocalizedMessage());
                    }


                    if (mettreRotation) {
                        plateau.generePlateau();
                        plateau.getjBRetirerPlateau().setVisible(false);
                        plateau.getjBValiderCoup().setVisible(true);
                        infoUtilisateur.setText("Cliquez sur votre pièce pour la faire tourner de 90° !");
                        jBcible.setBorder(BorderFactory.createLineBorder(rouge));
                        jBcible.addActionListener(rotation);
                    } else {
                        next();
                    }
                }
            }
        };

        validerCoup = new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                //enlever le listenner "rotation" sur this
                jBcible.removeActionListener(rotation);

                //on passe la main
                next();
            }
        };

        retirerPiece = new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                clearJButton();

                if (jBsource != null) {

                    int x = Integer.valueOf(String.valueOf(jBsource.getName().charAt(2)));
                    int y = Integer.valueOf(String.valueOf(jBsource.getName().charAt(3)));

                    plateau.getPlateauCaracteres().getTabCaracteres()[x][y] = 'X';
                }

                //on paase la main
                next();
            }
        };

        insertHGE = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,0):E");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,0):e");
                    }

                    //on passe la main
                    next();

                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertHGS = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,0):S");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,0):s");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertHDO = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,4):O");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,4):o");
                    }
                    //on passe la main
                    next();
                }catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertHDS = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,4):S");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,4):s");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertBDN = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,4):N");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,4):n");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertBDO = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,4):O");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,4):o");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertBGE = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,0):E");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,0):e");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insertBGN = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //insertion
                try {
                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,0):N");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,0):n");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insert01 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[0][1].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[0][1].removeActionListener(insert01);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,1):S");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,1):s");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        insert02 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[0][2].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[0][2].removeActionListener(insert02);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,2):S");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,2):s");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert03 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[0][3].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[0][3].removeActionListener(insert03);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,3):S");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(0,3):s");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert10 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[1][0].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[1][0].removeActionListener(insert10);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(1,0):E");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(1,0):e");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert20 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[2][0].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[2][0].removeActionListener(insert20);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(2,0):E");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(2,0):e");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert30 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[3][0].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[3][0].removeActionListener(insert30);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(3,0):E");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(3,0):e");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert14 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[1][4].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[1][4].removeActionListener(insert14);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(1,4):O");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(1,4):o");
                    }
                    //on passe la main
                    next();
                }catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert24 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[2][4].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[2][4].removeActionListener(insert24);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(2,4):O");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(2,4):o");
                    }
                    //on passe la main
                    next();
                }  catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert34 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[3][4].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[3][4].removeActionListener(insert34);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(3,4):O");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(3,4):o");
                    }
                    //on passe la main
                    next();
                }catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert41 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[4][1].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[4][1].removeActionListener(insert41);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,1):N");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,1):n");
                    }
                    //on passe la main
                    next();
                } catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert42 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[4][2].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[4][2].removeActionListener(insert42);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,2):N");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,2):n");
                    }
                    //on passe la main
                    next();
                }catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        insert43 = new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    plateau.getTabBouttons()[4][3].setBorder(BorderFactory.createLineBorder(gris));
                    plateau.getTabBouttons()[4][3].removeActionListener(insert43);

                    if (numJoueur == 1) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,3):N");
                    } else if (numJoueur == 2) {
                        plateau.getPlateauCaracteres().insererPiece("I(4,3):n");
                    }
                    //on passe la main
                    next();
                }catch (Exception ex) {
                    Logger.getLogger(JoueurHumain.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        if (plateau.getBDN().getActionListeners().length == 0) {
            plateau.getBDN().addActionListener(insertBDN);
        }
        if (plateau.getBDO().getActionListeners().length == 0) {
            plateau.getBDO().addActionListener(insertBDO);
        }
        if (plateau.getBGE().getActionListeners().length == 0) {
            plateau.getBGE().addActionListener(insertBGE);
        }
        if (plateau.getBGN().getActionListeners().length == 0) {
            plateau.getBGN().addActionListener(insertBGN);
        }
        if (plateau.getHDO().getActionListeners().length == 0) {
            plateau.getHDO().addActionListener(insertHDO);
        }
        if (plateau.getHDS().getActionListeners().length == 0) {
            plateau.getHDS().addActionListener(insertHDS);
        }
        if (plateau.getHGE().getActionListeners().length == 0) {
            plateau.getHGE().addActionListener(insertHGE);
        }
        if (plateau.getHGS().getActionListeners().length == 0) {
            plateau.getHGS().addActionListener(insertHGS);
        }
        if (plateau.getjBValiderCoup().getActionListeners().length == 0) {
            plateau.getjBValiderCoup().addActionListener(validerCoup);
        }
        if (plateau.getjBRetirerPlateau().getActionListeners().length == 0) {
            plateau.getjBRetirerPlateau().addActionListener(retirerPiece);
        }
    }

    public void jouer() {

        infoUtilisateur.setText("Cliquez sur un encadré rouge pour selectionner votre pièce !");

        jBcible = null;
        jBsource = null;

        plateau.getjBValiderCoup().setVisible(false);
        plateau.getjBRetirerPlateau().setVisible(false);

        clearJButton();

        if (numJoueur == 1) {
            if (plateau.getReserveElephant() > 0) {
                plateau.getReserveJoueur1().setBorder(BorderFactory.createLineBorder(rouge));
                //System.out.println("La reserve du joueur 1 est mise en surbriance");
                plateau.getReserveJoueur1().addActionListener(selectReserve);
            }
        }
        if (numJoueur == 2) {
            if (plateau.getReserveRino() > 0) {
                plateau.getReserveJoueur2().setBorder(BorderFactory.createLineBorder(rouge));
                //System.out.println("La reserve du joueur 2 est mise en surbriance");
                plateau.getReserveJoueur2().addActionListener(selectReserve);
            }
        }


        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (numJoueur == 1) {
                    if (plateau.getPlateauCaracteres().getPiece(i, j) == 'N' || plateau.getPlateauCaracteres().getPiece(i, j) == 'S' || plateau.getPlateauCaracteres().getPiece(i, j) == 'E' || plateau.getPlateauCaracteres().getPiece(i, j) == 'O') {
                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                        //System.out.println("La case [" + i + "][" + j + "] peut etre selectionnee par le joueur 1");
                        plateau.getTabBouttons()[i][j].addActionListener(selectJoueur);
                    }
                }
                if (numJoueur == 2) {
                    if (plateau.getPlateauCaracteres().getPiece(i, j) == 'n' || plateau.getPlateauCaracteres().getPiece(i, j) == 's' || plateau.getPlateauCaracteres().getPiece(i, j) == 'e' || plateau.getPlateauCaracteres().getPiece(i, j) == 'o') {
                        plateau.getTabBouttons()[i][j].setBorder(BorderFactory.createLineBorder(rouge));
                        //System.out.println("La case [" + i + "][" + j + "] peut etre selectionnee par le joueur 2");
                        plateau.getTabBouttons()[i][j].addActionListener(selectJoueur);
                    }
                }
            }
        }

    }

    private void removeAllActionListener() {
        for (JButton j : plateau.getAllBoutton()) {
            j.removeActionListener(selectReserve);
            j.removeActionListener(selectJoueur);
            j.removeActionListener(rotation);
            j.removeActionListener(deplacement);
            j.removeActionListener(insert01);
            j.removeActionListener(insert02);
            j.removeActionListener(insert03);
            j.removeActionListener(insert10);
            j.removeActionListener(insert14);
            j.removeActionListener(insert20);
            j.removeActionListener(insert24);
            j.removeActionListener(insert30);
            j.removeActionListener(insert34);
            j.removeActionListener(insert41);
            j.removeActionListener(insert42);
            j.removeActionListener(insert43);
        }
    }

    private void clearJButton() {
        removeAllActionListener();
        plateau.initEncadreGris();
        plateau.cacherFleches();
    }

    private void next() {

        clearJButton();

        plateau.generePlateau();
        nbCoup++;
        System.out.println("Le joueur " + numJoueur + " vient de jouer.");

        if (!plateau.getPlateauCaracteres().a3Montagnes()) {

            plateau.getjBRetirerPlateau().removeActionListener(retirerPiece);
            plateau.getjBValiderCoup().removeActionListener(validerCoup);

            System.out.println("Le joueur " + numJoueur + " a gagné en " + nbCoup + " coups !!!!!");

            String nomAnimal = "";
            if (numJoueur == 1) {
                nomAnimal = "Elephants";
            } else {
                nomAnimal = "Rhinos";
            }

            infoUtilisateur.setText("Les " + nomAnimal + " ont gagné la partie en " + nbCoup + " coups !!!!!");

            System.out.println("*************************");
            System.out.println("Fin de la partie");
            System.out.println("*************************\n\n");

        } else {
            adversaire.jouer();
        }
    }
}
